PORTFÓLIO DE R

  1. INTRODUÇÃO

Este R Markdown (“bloco de notas” extremamente avançado do RStudio e outras IDE de R) tem o objetivo de resumir minha experiência pessoal com a linguagem R.

Minha base de conhecimento é predominantemente marcada pelas aulas de R para Inteligência Artificial, no curso de MBA em IA e Machine Learning da FIAP, e que foram ministradas pelo mestre Elthon Manhas de Freitas, entre outubro de 2019 e janeiro de 2020.

Apesar da carga de aula de apenas 28h e adicionadas às horas investidas com trabalhos, pesquisas e exercícios, posso dizer que na jornada de projetos com IA, o R será um companheiro de viagem. Mesmo não sendo um especialista em R, Estatística e Análise Exploratória, o que me alegra é que tenho condições de saber quando usar o R e o que ele pode me ajudar na evolução tecnológica envolvendo engenharia, ciência e análise de DADOS.

Como estou usando um R Markdown, que é basicamente uma formato de arquivo que permite criar análises em R em forma de documentos, relatórios e apresentações, nos próximos parágrafos tentarei colocar instruções gerais e códigos para uso do R na prática.

  1. UM POUCO DE HISTÓRIA

O R é uma evolução da linguagem S. O S teve seu início com o desenvolvimento de John Chambers em 1976 e se tornou uma ferramenta reconhecida para finalidades cientíticas, porém não era Open Source e só estava disponível em pacotes comerciais. Então o R, “criado” por Ross Ihaka e Robert Gentleman (olha o porquê do R… :-) ), teve sua primeira publicação em 1993 e tornou-se software livre GNU em 1995.

O R é uma linguagem de programação interpretada e não compilada e os dados ficam em memória. Com isso, para laços e outra funcionalidades é uma linguagem de processamento mais lenta. Muito utilizada em análise exploratória de dados, estatística, matemática e para a finalidade que eu estou mais interessado neste momento, para uso com Inteligência Artificial. Sabendo que todos os outros conceitos são base para entender a IA :-).

  1. FERRAMENTAS / IDE

IDE (Integrated Development Environment ou Ambiente de Desenvolvimento Integrado) para uso do R que mais utilizei foi o RStudio.

RStudio: é um software Open Source para uso da linguagem R. Em linhas gerais ele tem 4 áreas principais. - Source: Onde criamos os scripts em R, podendo ser o formato R Script, Rmd R Markdown (exatamente como este), entre outros. Os código criados nesta área podem ser executados, assim passa a fazer uso de outros áreas, como o “Console” e o “Environment”. - Console: é a área onde os códigos são executados, então quando “rodamos” um R Script, basicamente é no console que ele é carregado para execução. É possível também criar um código diretamente nesta área, assim como um prompt de comando do Windows por exemplo. Isto é útil quando queremos ver um resultado ou testar algum código antes de fato criá-lo na área de Source. - Environmnent: é a área onde carregamos as variáveis quando executamos um código. Estas variáveis podem ser de vários tipos: como um vetor, uma matriz, uma string, um número, Data frame, entre outros tipos de dados do R. Você também consegue visualizar os valores de tais variáveis. - Files/Plots/Packages/Help: É a área onde podemos abrir os arquivos para a área de Source, apresentar gráficos gerados pela Console, Instalar pacotes padrões e customizados do R, além da área de ajuda (Help) do software e suas funções.

Abaixo seguem as configurações de aparência que deixei no meu RStudio:

Para mais informações sobre o RStudio e fazer download da instalação, tanto para Windows, Mac ou Linux acesse o site abaixo: https://rstudio.com/

Existe uma opção de usar o RStudio via Web, sem a necessidade de instalar localmente, pelo endereço abaixo: https://rstudio.cloud/

  1. PACOTES

Existem vários pacotes para R, que trazem funções e bibliotecas para facilitar manipulação de dados, construção de dados, conectividade, interação e visualização, além de várias outras facilidades.

Os pacotes são administrados e disponibilizados pela R Foundation no seguinte endereço: https://cran.r-project.org/

Neste site também são encontradas outras instalações necessárias para funcionamento do R localmente, como o RTools.

Usando o RStudio, o direcionamento para este diretório da Web é automático, então para instalar pacotes, basta utilizar a instrução ‘install.packages(#nome do pacote#)’.

A seguir vamos fazer a instalação de vários pacotes do R. Alguns são utilizados neste Portfólio.

#Pacotes importantes para uso do R:

install.packages(‘swirl’) install.packages(‘gridExtra’) install.packages(‘corrplot’) install.packages(‘readr’) install.packages(‘data.table’) install.packages(‘tidyr’) install.packages(‘forcats’) install.packages(‘ggrepel’) install.packages(‘ggridges’) install.packages(‘ggExtra’) install.packages(‘ggforce’) install.packages(‘viridis’) install.packages(‘broom’) install.packages(‘lubridate’) install.packages(‘timeDate’) install.packages(‘tseries’) install.packages(‘forecast’) install.packages(‘prophet’) install.packages(‘timetk’) install.packages(‘geosphere’) install.packages(‘leaflet’) install.packages(‘leaflet.extras’) install.packages(‘dplyr’) install.packages(‘plotly’) install.packages(‘plot3D’) install.packages(‘readxl’) install.packages(‘fractional’)

E abaixo a sequência para carregar os pacotes no ambiente do R, para uso nos códigos que virão a seguir.

# Pacotes para visualização
library('ggplot2') # visualisation
library('scales') # visualisation
library('grid') # 
library('gridExtra') # visualisation
library('RColorBrewer') # visualisation
library('corrplot') # visualisation
## corrplot 0.84 loaded
# Pacotes para manipulação de dados
library('dplyr') # data manipulation
## Warning: package 'dplyr' was built under R version 3.6.3
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library('readr') # input/output
## 
## Attaching package: 'readr'
## The following object is masked from 'package:scales':
## 
##     col_factor
library('data.table') # data manipulation
## 
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
library('tibble') # data wrangling
library('tidyr') # data wrangling
library('stringr') # string manipulation
library('forcats') # factor manipulation
library('lazyeval') # data wrangling
library('broom') # data wrangling
library('purrr') # string manipulation
## 
## Attaching package: 'purrr'
## The following objects are masked from 'package:lazyeval':
## 
##     is_atomic, is_formula
## The following object is masked from 'package:data.table':
## 
##     transpose
## The following object is masked from 'package:scales':
## 
##     discard
library('readxl') #file manipulation

# Pacotes específicos para visualização
library('ggrepel') # visualisation
library('ggridges') # visualisation
library('ggExtra') # visualisation
library('ggforce') # visualisation
library('viridis') # visualisation
## Loading required package: viridisLite
## 
## Attaching package: 'viridis'
## The following object is masked from 'package:scales':
## 
##     viridis_pal
# Pacotes de predição, série temporal
library('lubridate') # date and time
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:data.table':
## 
##     hour, isoweek, mday, minute, month, quarter, second, wday, week,
##     yday, year
## The following object is masked from 'package:base':
## 
##     date
library('timeDate') # date and time
library('tseries') # time series analysis
## Registered S3 method overwritten by 'xts':
##   method     from
##   as.zoo.xts zoo
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library('forecast') # time series analysis
## Registered S3 methods overwritten by 'forecast':
##   method             from    
##   fitted.fracdiff    fracdiff
##   residuals.fracdiff fracdiff
library('prophet') # time series analysis
## Loading required package: Rcpp
## Loading required package: rlang
## Warning: package 'rlang' was built under R version 3.6.3
## 
## Attaching package: 'rlang'
## The following objects are masked from 'package:purrr':
## 
##     %@%, as_function, flatten, flatten_chr, flatten_dbl, flatten_int,
##     flatten_lgl, flatten_raw, invoke, list_along, modify, prepend,
##     splice
## The following objects are masked from 'package:lazyeval':
## 
##     as_name, call_modify, call_standardise, expr_label, expr_text,
##     f_env, f_env<-, f_label, f_lhs, f_lhs<-, f_rhs, f_rhs<-, f_text,
##     is_atomic, is_call, is_formula, is_lang, is_pairlist, missing_arg
## The following object is masked from 'package:data.table':
## 
##     :=
library('timetk') # time series analysis

# Pacotes para mapas e geolocalização
library('geosphere') # geospatial locations
library('leaflet') # maps
library('leaflet.extras') # maps
library('maps') # maps
## 
## Attaching package: 'maps'
## The following object is masked from 'package:purrr':
## 
##     map
library('fractional') #fraction operations
## Warning: package 'fractional' was built under R version 3.6.3
  1. USANDO O R NA PRÁTICA

Bom, uma vez tendo os pacotes instalados, podemos carregá-los a medida da necessidade.

Para iniciar pelo básico do R, vamos mostrar algumas facilidades, como uma simples calculadora.

Falando nisso, eu pelo menos já substituí o excel e a calculadora do Windows para fazer contas no computador, pois você pode ir colocando a expressão diretamente no R e já visualizar a resposta. Veja o exemplo.

Ah, antes disso, você deve ter percebido quando desejo usar a linguagem R, como no caso de instalar os pacotes anterior, acabo usando três crases sequencias e o texto {r}, que é para iniciar um código no R Markdown e para finalizar o código é necessário colocar três crases novamente. Quando estamos na área de código, para incluir comentários, basta colocar um # antes do texto.

Bom, vamos a nossa calculadora no R.

#Os seguintes cálculos podem ser usados diretamente na área do Console ou como um Script na área de Source para verificar os resultados.

1+1 #conta de adição básica
## [1] 2
2-1+4-5 #adição e subtração
## [1] 0
4*2+15 #multiplicação e adição
## [1] 23
10/2-1 #multplicação e subtração
## [1] 4
2**9 #potência, neste caso 2 elevado a 9.
## [1] 512
sqrt(9) #raiz quadrada
## [1] 3
2.5+2.5 #uso de números decimais (usar ponto ao invés da vírgula)
## [1] 5
Frac1 <- fractional(x = (3/11) - (3/11)*((23/4)- (23/4)))

Frac1
## [1] 3/11
Frac2 <- fractional(x = (2/4) * (14/3)) # maxConv = 30)

Frac2
## [1] 7/3

Também conseguimos usar vários tipos de dados. E à partir daqui será comum usarmos a atribuição de valores e dados a uma determinada variável. No R, diferentes de outras linguagens, é possível criar uma variável e atribuir um valor, sem definir o tipo de dado a receber previamente. A sintaxe de atribuição também tem bastante flexibilidade. Vamos aos exemplos:

x <- c(3, 4.5) #atribuindo um vetor de 2 dimensões para a variável x com a função c (que vem de 'Combine')

x #exibindo a variável de 2 dimensões
## [1] 3.0 4.5
#outras formas de fazer atribuição no R

y = c(3, 4.5)
c(3, 4.5)->z

#exibir as variáveis na saída do R Markdown:
y
## [1] 3.0 4.5
z
## [1] 3.0 4.5

Abaixo faremos outras atribuições usando outros tipos de dados

var_string1 <- 'Olá, Mundo!' #atribuição de uma string. Pode usar aspas duplas também.
var_int1 <- 10L #atribuição de um número inteiro (forçada a letra L, justamente para ficar como inteiro e não como numérico)
var_float1 <- 3.14 #atribuição de um número decimal
var_bool1 <- TRUE #atribuição de uma variável lógica (booleana)
var_matrix1 <- matrix(33, nrow = 5, ncol = 5) #atribuição o valor 33 a uma matrix de 5 linhas e 5 colunas
var_complex1 <- 9.99i #atribuição de um número complexo (o R já entende o i como a componente complexa)
var_vector1 <- c(100, 44, 3.14, TRUE, FALSE, var_matrix1) #atribuindo um vetor, com dados inteiros, booleanos, numéricos e de matriz. Neste caso o R converte a variável em um tipo que seja válido para todas as informações do dados. Neste caso "Numeric".
var_dataframe1 <- mtcars #atribuição de um dado do tipo data.frame (um dos mais utilizados no R)
var_timeseries1 <- AirPassengers #atribuição de um TS (Série Temporal)

#Abaixo é uma função para verificar o tipo de dado na variável.
class(var_string1)
## [1] "character"
class(var_int1)
## [1] "integer"
class(var_float1)
## [1] "numeric"
class(var_bool1)
## [1] "logical"
class(var_matrix1)
## [1] "matrix"
class(var_complex1)
## [1] "complex"
class(var_vector1)
## [1] "numeric"
class(var_dataframe1)
## [1] "data.frame"
class(var_timeseries1)
## [1] "ts"

Agora podemos brincar um pouco com outras funcionalidades do R, como sequência e outros tipos de dados.

Daqui em diante, tentarei compartilhar os próprios códigos que usei em sala de aula com os comentários nas próprias linhas de código. Caso você tenha dúvida no uso de alguma funcionalidade, me chame no linkedin: www.linkedin.com/in/jurandir-ventura

Uso de sequência no R:

#Fazendo uma sequência de 30 números de 5 a 10:

my_seq<-seq(5,10,length.out = 30)

#exibindo o resultado
my_seq
##  [1]  5.000000  5.172414  5.344828  5.517241  5.689655  5.862069  6.034483
##  [8]  6.206897  6.379310  6.551724  6.724138  6.896552  7.068966  7.241379
## [15]  7.413793  7.586207  7.758621  7.931034  8.103448  8.275862  8.448276
## [22]  8.620690  8.793103  8.965517  9.137931  9.310345  9.482759  9.655172
## [29]  9.827586 10.000000
#verificanco o tamanho da variável
length(my_seq)
## [1] 30
#index da sequência criada em my_seq
c<-seq_along(my_seq)
#Sequência de pi (constante), até 10
a<-c(pi:10)            

#Sequência de 10 até pi (constante)
b<-c(10:pi)            

#exibindo o resultado
a
## [1] 3.141593 4.141593 5.141593 6.141593 7.141593 8.141593 9.141593
b
## [1] 10  9  8  7  6  5  4

Atribuição ou resultados de outros tipos de dados no R (NA, NaN, Inf, NULL)

#NA e NaN (not a number)
d<-0/0
e<-sqrt(-4)
## Warning in sqrt(-4): NaNs produzidos
#Inf e -Inf
f<-19/0
g<--19/0


#NULL (veja que o NULL não aparece na exibição do resultado na variável h)
h<-c(1, NA, NULL, 2)

d
## [1] NaN
e
## [1] NaN
f
## [1] Inf
g
## [1] -Inf
h
## [1]  1 NA  2

Aqui faremos o carregamento de um data.frame (mtcars) e faremos algumas manipulações para atribuição de valores (NULL, NA, etc.), além de fazer alguns testes para saber se a variável é do tipo que estamos perguntando.

#carregar o data.frame na variável test.
test<-mtcars

#exibir o valor da coluna hp do data.frame antes de "limpar com NULL"
test$hp
##  [1] 110 110  93 110 175 105 245  62  95 123 123 180 180 180 205 215 230  66  52
## [20]  65  97 150 150 245 175  66  91 113 264 175 335 109
#atribuir o valor NULL para toda a coluna hp
test$hp <- NULL
test2<-test$hp

#exibir a coluna hp com os valores em NULL (veja que não tem nada)
test2
## NULL
#atribuir o NA para toda a coluna mpg
test$mpg <- NA

var_na<- NA
var_null<- NULL
var_nan<- NaN
var_inf<- Inf
var_minusinf <- -(Inf)

vector1<-c(var_na, var_null, var_nan, var_inf, var_minusinf)

#testes para saber se o tipo do dado é exatamente o que perguntamos. Veja que o teste verifica cada dimensão do vetor.
is.na(vector1)
## [1]  TRUE  TRUE FALSE FALSE
is.nan(vector1)
## [1] FALSE  TRUE FALSE FALSE
is.null(vector1)
## [1] FALSE
is.infinite(vector1)
## [1] FALSE FALSE  TRUE  TRUE
is.finite(vector1)
## [1] FALSE FALSE FALSE FALSE
is.null(var_null)
## [1] TRUE
is.na(var_null)
## logical(0)

Agora começaremos a entrar na manipulação de dados, fazendo filtros de conjuntos e subconjuntos.

# Filtrando conjuntos/subconjuntos

test<-mtcars

mtcars[2, 5] #filtrar o valor da linha 2 e coluna 5
## [1] 3.9
mtcars[2:4, 5] #filtrar o valor entre as linhas 2 e 4 coluna 5
## [1] 3.90 3.85 3.08
mtcars[2:4, 5, drop=F]#filtrar o valor entre as linhas 2 e 4 coluna 5, mantendo os labels
##                drat
## Mazda RX4 Wag  3.90
## Datsun 710     3.85
## Hornet 4 Drive 3.08
mtcars[2:4, 5:7] #filtrar conjuntos entre as linhas 2 a 4 e colunas 5 a 7
##                drat    wt  qsec
## Mazda RX4 Wag  3.90 2.875 17.02
## Datsun 710     3.85 2.320 18.61
## Hornet 4 Drive 3.08 3.215 19.44
mtcars[8:9, c(1,2,4)] #filrar conjuntos entre linhas 8 a 9 e colunas 1, 2 e 4
##            mpg cyl hp
## Merc 240D 24.4   4 62
## Merc 230  22.8   4 95
mtcars[2:4, c("mpg", "wt")]#filtrar conjuntos entre linhas 2 a 4 e colunas de nome 'mpg' e 'wt'
##                 mpg    wt
## Mazda RX4 Wag  21.0 2.875
## Datsun 710     22.8 2.320
## Hornet 4 Drive 21.4 3.215
# Filtrar em todas as colunas valores de mpg >= 15

#opcao 1
Filtro_bool<-mtcars$mpg >= 15
Busca1<-mtcars[Filtro_bool,]

#opcao 2
Busca2<-mtcars[mtcars$mpg >= 15, ]

Agora vamos verificar como manipular data e hora no R. Primeiramente usando a biblioteca padrão do R.

#Experimento com data e hora

dia_texto <- "28/09/2017 T 18:51:30"
dia_date <- as.Date(dia_texto,format="%d/%m/%Y T %H:%M:%S",tz="America/Sao_Paulo")
dia.time1 <- as.POSIXct(dia_texto,format="%d/%m/%Y T %H:%M:%S",tz="America/Sao_Paulo")
dia.time2 <- as.POSIXlt(dia_texto,format="%d/%m/%Y T %H:%M:%S",tz="America/Sao_Paulo")
dia_date
## [1] "2017-09-28"
dia.time1
## [1] "2017-09-28 18:51:30 -03"
dia.time2
## [1] "2017-09-28 18:51:30 -03"
unclass(dia_date)
## [1] 17437
unclass(dia.time1)
## [1] 1506635490
## attr(,"tzone")
## [1] "America/Sao_Paulo"
unclass(dia.time2)
## $sec
## [1] 30
## 
## $min
## [1] 51
## 
## $hour
## [1] 18
## 
## $mday
## [1] 28
## 
## $mon
## [1] 8
## 
## $year
## [1] 117
## 
## $wday
## [1] 4
## 
## $yday
## [1] 270
## 
## $isdst
## [1] 0
## 
## $zone
## [1] "-03"
## 
## $gmtoff
## [1] NA
## 
## attr(,"tzone")
## [1] "America/Sao_Paulo"

Pausa para a hora da dica. Muitas vezes para manipular hora no R você vai precisar definir o time zone, então abaixo uma linha de código possível de se utilizar nestes momentos, definindo o horário de São Paulo neste caso.

Test1<-0
as.POSIXlt.POSIXct(Test1, tz = "America/Sao_Paulo")
## [1] "1969-12-31 21:00:00 -03"

Bom, com a dica dada, vamos agora fazer algo mais profissional com data e hora, usando o pacote lubridate.

# Usando a bibliota lubridate (várias funcoes prontas)
library(lubridate)

ymd("20191128")
## [1] "2019-11-28"
ymd("2019.11.28")
## [1] "2019-11-28"
#exercicio lubridate

duracao<-duration(260)

duracao2<-duration(260) / 60


duracao3_dia<- duration(1, units="days")
duracao4_dia<- duracao3_dia - duration(60, units="minutes")
## Note: method with signature 'Duration#ANY' chosen for function '-',
##  target signature 'Duration#Duration'.
##  "ANY#Duration" would also be valid
duracao3a_dia<- ddays(1)
duracao4a_dia<-duracao3a_dia - dminutes(60)

Agora um exercício interessante: calcular o dia que cairá a black friday. Esta data é possível calcular, tendo a informação de que ela cai na quarta sexta-feira do mês de novembro.

Veja essa manipulação na prática.

# Calculo do dia da Black Friday 2018, 2019, 2020, 2021 e 2022

dia1.nov<- ymd(20181101)
dia1.nov<- c(dia1.nov, dia1.nov + years(1), dia1.nov + years(2), dia1.nov + years(3), dia1.nov + years(4))

dia1.nov
## [1] "2018-11-01" "2019-11-01" "2020-11-01" "2021-11-01" "2022-11-01"
dias.Quinta.nov <- dia1.nov + 5 - wday(dia1.nov)
dias.Quinta.nov
## [1] "2018-11-01" "2019-10-31" "2020-11-05" "2021-11-04" "2022-11-03"
dias.Quinta.nov[month(dias.Quinta.nov) < 11] <- dias.Quinta.nov[month(dias.Quinta.nov) < 11] + dweeks(1)

# exibição dos dias da black friday de 2018 a 2022
dias.Quinta.nov
## [1] "2018-11-01" "2019-11-07" "2020-11-05" "2021-11-04" "2022-11-03"
dia.black.friday <-dias.Quinta.nov + dweeks(3) + ddays(1)
dia.black.friday
## [1] "2018-11-23" "2019-11-29" "2020-11-27" "2021-11-26" "2022-11-25"
#Validacao que todos os dias calculados sao sexta-feiras
wday(dia.black.friday, label = TRUE)
## [1] sex sex sex sex sex
## Levels: dom < seg < ter < qua < qui < sex < sáb

Neste tópico vamos mostrar alguns exemplos de manipulação de matrizes. E também converter um Data.frame para uma matriz.

#Primeiro vamos atribuir alguns valores às variáveis a seguir:

a<- c(336634, 19830211, 830, 297982, 3802)
b<- a * 2
c<- b / 3
d<- c + a**2
e<- sqrt(d)
ai<-a
ai<-ai[5:1]


#Agora vamos criar as matrizes
M1<- matrix(c(a,b,c,d,e,ai),nrow=6, ncol=5, byrow = TRUE)
M2<- matrix(c(a,b,c,d,e,ai),nrow=5, ncol=6, byrow = FALSE)
M1
##              [,1]         [,2]        [,3]         [,4]         [,5]
## [1,] 3.366340e+05 1.983021e+07    830.0000 2.979820e+05     3802.000
## [2,] 6.732680e+05 3.966042e+07   1660.0000 5.959640e+05     7604.000
## [3,] 2.244227e+05 1.322014e+07    553.3333 1.986547e+05     2534.667
## [4,] 1.133227e+11 3.932373e+14 689453.3333 8.879347e+10 14457738.667
## [5,] 3.366343e+05 1.983021e+07    830.3333 2.979823e+05     3802.333
## [6,] 3.802000e+03 2.979820e+05    830.0000 1.983021e+07   336634.000
M2
##          [,1]     [,2]         [,3]         [,4]         [,5]     [,6]
## [1,]   336634   673268 2.244227e+05 1.133227e+11 3.366343e+05     3802
## [2,] 19830211 39660422 1.322014e+07 3.932373e+14 1.983021e+07   297982
## [3,]      830     1660 5.533333e+02 6.894533e+05 8.303333e+02      830
## [4,]   297982   595964 1.986547e+05 8.879347e+10 2.979823e+05 19830211
## [5,]     3802     7604 2.534667e+03 1.445774e+07 3.802333e+03   336634
#Fazer a multiplicação de todos os elementos da matriz pelo valor 0.1
M3<-M1*0.1
M3
##              [,1]         [,2]        [,3]         [,4]         [,5]
## [1,] 3.366340e+04 1.983021e+06    83.00000 2.979820e+04     380.2000
## [2,] 6.732680e+04 3.966042e+06   166.00000 5.959640e+04     760.4000
## [3,] 2.244227e+04 1.322014e+06    55.33333 1.986547e+04     253.4667
## [4,] 1.133227e+10 3.932373e+13 68945.33333 8.879347e+09 1445773.8667
## [5,] 3.366343e+04 1.983021e+06    83.03333 2.979823e+04     380.2333
## [6,] 3.802000e+02 2.979820e+04    83.00000 1.983021e+06   33663.4000
# verificando o tipo de dado na variável attitude (já carregada no R como padrão)
class(attitude)
## [1] "data.frame"
# tamanho dimensional da variável
dim(attitude)
## [1] 30  7
#atribuindo 
M4<-as.matrix(attitude[1:5, 2:7])

#Multiplicacao caso 1 (elemento por elemento)
M5<-M1 * M3
M6<-M3 * M1 

#Multiplicacao de Matrix A(la, ca) x B(lb, cb) = C(lc, cc)
M7<- M1 %*% M4
M8<- M4 %*% M1

#Comparando se são iguais
M5 == M6 #tudo igual (TRUE)
##      [,1] [,2] [,3] [,4] [,5]
## [1,] TRUE TRUE TRUE TRUE TRUE
## [2,] TRUE TRUE TRUE TRUE TRUE
## [3,] TRUE TRUE TRUE TRUE TRUE
## [4,] TRUE TRUE TRUE TRUE TRUE
## [5,] TRUE TRUE TRUE TRUE TRUE
## [6,] TRUE TRUE TRUE TRUE TRUE
#M7 == M8 #matrizes direrentes / non-conformable para comparação

Aqui vamos colocar nomes para linhas de uma matrix. E para relembrar as aulas da professora Vera Marsson (espero não ter errado seu sobrenome “fessora”), vamos colocar o conceito de matrix identidade no final do código.

coeficientes <- matrix(c(50, 0.05, -25.79), ncol = 1)
rownames(coeficientes) <- c("beta01", "beta02", "beta03")

clientes<- matrix(c(1, 10000, 1,
                    1, 12000, 1,
                    1, 8000, 0), ncol=3, nrow=3, byrow=T)
rownames(clientes)<- c("Pedro", "Ana", "João")

coeficientes
##          [,1]
## beta01  50.00
## beta02   0.05
## beta03 -25.79
clientes
##       [,1]  [,2] [,3]
## Pedro    1 10000    1
## Ana      1 12000    1
## João     1  8000    0
var.independente<-clientes %*% coeficientes

#matrix identidade (diagonal de valor 1) / A %*% A-1 = I (identidade)

diag(1, nrow = 5)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    0    0    0    0
## [2,]    0    1    0    0    0
## [3,]    0    0    1    0    0
## [4,]    0    0    0    1    0
## [5,]    0    0    0    0    1

Agora entraremos no tópico de amostras, para já começar a pensar em uso mais específico de estatística.

#Amostras e simulações

set.seed(1) # (x) define a amostra aleatória sempre na mesma sequência de acordo com a arquitetura. Assim é possível ter os mesmo resultados. Útil para comparar resultados feitos por pessoas e máquinas diferentes.

#carrega cada letra da palavra triangulos
amostra = c( "T", "R", "I", "A", "N", "G", "U", "L", "O", "S")

#Faz a amostragem, mas sem repetir elemento da amostra
sample(x = amostra, replace = FALSE)
##  [1] "O" "A" "U" "T" "R" "N" "I" "S" "G" "L"
#Faz a amostragem, podendo repetir elemento da amostra, pois ele volta para a "população"
sample(x = amostra, replace = TRUE)
##  [1] "I" "T" "N" "N" "S" "G" "S" "U" "O" "N"
#Faz a amostragem de 5 elementos
sample(x = amostra, size = 5)
## [1] "N" "O" "T" "G" "S"
#Faz a amostragem de 5 elementos, podendo repetir com uma probabilidade maior (5 vezes) de acontecer a 3a. e última letra. Neste caso definimos a probabilidade de 1 para as demais letras.
sample(x = amostra, size = 10, replace = TRUE,
prob = c(1, 1, 5, 1, 1, 1, 1, 1, 1, 5))
##  [1] "O" "S" "S" "G" "S" "I" "A" "L" "A" "I"

Aqui continuamos com a manipulação de dados e amostras. É importante comentar que a função summary é extremamente útil para visualizar os dados de uma amostra, pois já traz o resumo estatístico, tais como: média, mediana, valor mínimo, valor máximo, 1o. quartil, etc.

#Amostra de base de dados data.frame "airquality"

set.seed(3)
airquality
##     Ozone Solar.R Wind Temp Month Day
## 1      41     190  7.4   67     5   1
## 2      36     118  8.0   72     5   2
## 3      12     149 12.6   74     5   3
## 4      18     313 11.5   62     5   4
## 5      NA      NA 14.3   56     5   5
## 6      28      NA 14.9   66     5   6
## 7      23     299  8.6   65     5   7
## 8      19      99 13.8   59     5   8
## 9       8      19 20.1   61     5   9
## 10     NA     194  8.6   69     5  10
## 11      7      NA  6.9   74     5  11
## 12     16     256  9.7   69     5  12
## 13     11     290  9.2   66     5  13
## 14     14     274 10.9   68     5  14
## 15     18      65 13.2   58     5  15
## 16     14     334 11.5   64     5  16
## 17     34     307 12.0   66     5  17
## 18      6      78 18.4   57     5  18
## 19     30     322 11.5   68     5  19
## 20     11      44  9.7   62     5  20
## 21      1       8  9.7   59     5  21
## 22     11     320 16.6   73     5  22
## 23      4      25  9.7   61     5  23
## 24     32      92 12.0   61     5  24
## 25     NA      66 16.6   57     5  25
## 26     NA     266 14.9   58     5  26
## 27     NA      NA  8.0   57     5  27
## 28     23      13 12.0   67     5  28
## 29     45     252 14.9   81     5  29
## 30    115     223  5.7   79     5  30
## 31     37     279  7.4   76     5  31
## 32     NA     286  8.6   78     6   1
## 33     NA     287  9.7   74     6   2
## 34     NA     242 16.1   67     6   3
## 35     NA     186  9.2   84     6   4
## 36     NA     220  8.6   85     6   5
## 37     NA     264 14.3   79     6   6
## 38     29     127  9.7   82     6   7
## 39     NA     273  6.9   87     6   8
## 40     71     291 13.8   90     6   9
## 41     39     323 11.5   87     6  10
## 42     NA     259 10.9   93     6  11
## 43     NA     250  9.2   92     6  12
## 44     23     148  8.0   82     6  13
## 45     NA     332 13.8   80     6  14
## 46     NA     322 11.5   79     6  15
## 47     21     191 14.9   77     6  16
## 48     37     284 20.7   72     6  17
## 49     20      37  9.2   65     6  18
## 50     12     120 11.5   73     6  19
## 51     13     137 10.3   76     6  20
## 52     NA     150  6.3   77     6  21
## 53     NA      59  1.7   76     6  22
## 54     NA      91  4.6   76     6  23
## 55     NA     250  6.3   76     6  24
## 56     NA     135  8.0   75     6  25
## 57     NA     127  8.0   78     6  26
## 58     NA      47 10.3   73     6  27
## 59     NA      98 11.5   80     6  28
## 60     NA      31 14.9   77     6  29
## 61     NA     138  8.0   83     6  30
## 62    135     269  4.1   84     7   1
## 63     49     248  9.2   85     7   2
## 64     32     236  9.2   81     7   3
## 65     NA     101 10.9   84     7   4
## 66     64     175  4.6   83     7   5
## 67     40     314 10.9   83     7   6
## 68     77     276  5.1   88     7   7
## 69     97     267  6.3   92     7   8
## 70     97     272  5.7   92     7   9
## 71     85     175  7.4   89     7  10
## 72     NA     139  8.6   82     7  11
## 73     10     264 14.3   73     7  12
## 74     27     175 14.9   81     7  13
## 75     NA     291 14.9   91     7  14
## 76      7      48 14.3   80     7  15
## 77     48     260  6.9   81     7  16
## 78     35     274 10.3   82     7  17
## 79     61     285  6.3   84     7  18
## 80     79     187  5.1   87     7  19
## 81     63     220 11.5   85     7  20
## 82     16       7  6.9   74     7  21
## 83     NA     258  9.7   81     7  22
## 84     NA     295 11.5   82     7  23
## 85     80     294  8.6   86     7  24
## 86    108     223  8.0   85     7  25
## 87     20      81  8.6   82     7  26
## 88     52      82 12.0   86     7  27
## 89     82     213  7.4   88     7  28
## 90     50     275  7.4   86     7  29
## 91     64     253  7.4   83     7  30
## 92     59     254  9.2   81     7  31
## 93     39      83  6.9   81     8   1
## 94      9      24 13.8   81     8   2
## 95     16      77  7.4   82     8   3
## 96     78      NA  6.9   86     8   4
## 97     35      NA  7.4   85     8   5
## 98     66      NA  4.6   87     8   6
## 99    122     255  4.0   89     8   7
## 100    89     229 10.3   90     8   8
## 101   110     207  8.0   90     8   9
## 102    NA     222  8.6   92     8  10
## 103    NA     137 11.5   86     8  11
## 104    44     192 11.5   86     8  12
## 105    28     273 11.5   82     8  13
## 106    65     157  9.7   80     8  14
## 107    NA      64 11.5   79     8  15
## 108    22      71 10.3   77     8  16
## 109    59      51  6.3   79     8  17
## 110    23     115  7.4   76     8  18
## 111    31     244 10.9   78     8  19
## 112    44     190 10.3   78     8  20
## 113    21     259 15.5   77     8  21
## 114     9      36 14.3   72     8  22
## 115    NA     255 12.6   75     8  23
## 116    45     212  9.7   79     8  24
## 117   168     238  3.4   81     8  25
## 118    73     215  8.0   86     8  26
## 119    NA     153  5.7   88     8  27
## 120    76     203  9.7   97     8  28
## 121   118     225  2.3   94     8  29
## 122    84     237  6.3   96     8  30
## 123    85     188  6.3   94     8  31
## 124    96     167  6.9   91     9   1
## 125    78     197  5.1   92     9   2
## 126    73     183  2.8   93     9   3
## 127    91     189  4.6   93     9   4
## 128    47      95  7.4   87     9   5
## 129    32      92 15.5   84     9   6
## 130    20     252 10.9   80     9   7
## 131    23     220 10.3   78     9   8
## 132    21     230 10.9   75     9   9
## 133    24     259  9.7   73     9  10
## 134    44     236 14.9   81     9  11
## 135    21     259 15.5   76     9  12
## 136    28     238  6.3   77     9  13
## 137     9      24 10.9   71     9  14
## 138    13     112 11.5   71     9  15
## 139    46     237  6.9   78     9  16
## 140    18     224 13.8   67     9  17
## 141    13      27 10.3   76     9  18
## 142    24     238 10.3   68     9  19
## 143    16     201  8.0   82     9  20
## 144    13     238 12.6   64     9  21
## 145    23      14  9.2   71     9  22
## 146    36     139 10.3   81     9  23
## 147     7      49 10.3   69     9  24
## 148    14      20 16.6   63     9  25
## 149    30     193  6.9   70     9  26
## 150    NA     145 13.2   77     9  27
## 151    14     191 14.3   75     9  28
## 152    18     131  8.0   76     9  29
## 153    20     223 11.5   68     9  30
dim(airquality) # verifica o tamanho do data.frame.
## [1] 153   6
summary(airquality) #função muito útil de visualização estatística
##      Ozone           Solar.R           Wind             Temp      
##  Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
##  1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
##  Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
##  Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
##  3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
##  Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
##  NA's   :37       NA's   :7                                       
##      Month            Day      
##  Min.   :5.000   Min.   : 1.0  
##  1st Qu.:6.000   1st Qu.: 8.0  
##  Median :7.000   Median :16.0  
##  Mean   :6.993   Mean   :15.8  
##  3rd Qu.:8.000   3rd Qu.:23.0  
##  Max.   :9.000   Max.   :31.0  
## 
#10 primeiros
head(airquality, n= 10)
##    Ozone Solar.R Wind Temp Month Day
## 1     41     190  7.4   67     5   1
## 2     36     118  8.0   72     5   2
## 3     12     149 12.6   74     5   3
## 4     18     313 11.5   62     5   4
## 5     NA      NA 14.3   56     5   5
## 6     28      NA 14.9   66     5   6
## 7     23     299  8.6   65     5   7
## 8     19      99 13.8   59     5   8
## 9      8      19 20.1   61     5   9
## 10    NA     194  8.6   69     5  10
#10 aleatórios
S1<-head(sample(x = airquality, replace = TRUE), n= 10)
# faz sorteio das colunas, mas não das linhas
S1
##    Month Solar.R Temp Temp.1 Solar.R.1 Wind
## 1      5     190   67     67       190  7.4
## 2      5     118   72     72       118  8.0
## 3      5     149   74     74       149 12.6
## 4      5     313   62     62       313 11.5
## 5      5      NA   56     56        NA 14.3
## 6      5      NA   66     66        NA 14.9
## 7      5     299   65     65       299  8.6
## 8      5      99   59     59        99 13.8
## 9      5      19   61     61        19 20.1
## 10     5     194   69     69       194  8.6
S2<-airquality[runif(10, 1, 153),]
# agora faz o aleatorio das linhas, com colunas fixas
S2
##     Ozone Solar.R Wind Temp Month Day
## 88     52      82 12.0   86     7  27
## 96     78      NA  6.9   86     8   4
## 78     35     274 10.3   82     7  17
## 77     48     260  6.9   81     7  16
## 82     16       7  6.9   74     7  21
## 85     80     294  8.6   86     7  24
## 132    21     230 10.9   75     9   9
## 127    91     189  4.6   93     9   4
## 17     34     307 12.0   66     5  17
## 107    NA      64 11.5   79     8  15
S3<-airquality[sample(row.names(airquality), 10),]
# outra forma de fazer o aleatorio das linhas, com colunas fixas

S4<-sample_n(airquality, 10)
# outra forma
S4
##    Ozone Solar.R Wind Temp Month Day
## 1     11     320 16.6   73     5  22
## 2     97     272  5.7   92     7   9
## 3     71     291 13.8   90     6   9
## 4     18      65 13.2   58     5  15
## 5     27     175 14.9   81     7  13
## 6     NA     291 14.9   91     7  14
## 7     45     252 14.9   81     5  29
## 8     20      81  8.6   82     7  26
## 9     23     220 10.3   78     9   8
## 10   135     269  4.1   84     7   1
linhas.idx<-seq_len(nrow(airquality)) #cria a sequência com o número de linhas do airquality
linhas.idx
##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
##  [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
##  [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
##  [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
##  [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
##  [91]  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108
## [109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
## [127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
## [145] 145 146 147 148 149 150 151 152 153
# mais uma forma de se fazer a amostra
linhas.sample<- sample(linhas.idx, 10)
S5<-airquality[linhas.sample,]
S5
##     Ozone Solar.R Wind Temp Month Day
## 127    91     189  4.6   93     9   4
## 101   110     207  8.0   90     8   9
## 136    28     238  6.3   77     9  13
## 138    13     112 11.5   71     9  15
## 68     77     276  5.1   88     7   7
## 33     NA     287  9.7   74     6   2
## 19     30     322 11.5   68     5  19
## 116    45     212  9.7   79     8  24
## 135    21     259 15.5   76     9  12
## 65     NA     101 10.9   84     7   4

Agora começamos a fazer distriuição de dados e assim podemos pensar em plotar alguns gráficos para visualizar correlações e o início do conceito de regressão linear.

#simulações
rm(list=ls())
set.seed(19)

valor.x<-rnorm(100, 0, 1)
valor.E<-rnorm(100,0,2)
Beta.0<-rep(0.5,100)
Beta.1<-rep(2.0,100)

valor.y<-Beta.0 + Beta.1*valor.x + valor.E

plot(x = valor.x, y = valor.y)

#plot_ly(x = valor.x, y = valor.y, type = "scatter")
#segmento.reta<-plot_ly(x = valor.x, y = valor.y, type = "scatter")

#adicionando um segmento de reta simples (não é regressão ainda)
#add_segments(segmento.reta,x=-2.5, xend = 2.9, y = -6, yend = 8.2)

#fazendo com regressão
regressao <- lm (formula = x ~ y,
                 data = data.frame(x=valor.x, y=valor.y))

Agora para os apaixonados por linguagem de programação e os famosos IF THEN ELSE, vamos mostrar um pouco das sintaxes de laços em R e já implementar o conceito de função, pois é onde utilizamos os laços de forma mais prática.

# O primeiro exemplo de laço é usando FOR.

#Para isso, vamos usar o dado AirPassenges (já carregado no R)

rm(list=ls())

class(AirPassengers) #é um TimeSeries (TS)
## [1] "ts"
#Opcao 1
Count1<-0
Result1<-c()

for (i in AirPassengers){
  Count1<-Count1 + i
  Result1<- c(Result1, Count1)
  print(paste(i, Count1))
}
## [1] "112 112"
## [1] "118 230"
## [1] "132 362"
## [1] "129 491"
## [1] "121 612"
## [1] "135 747"
## [1] "148 895"
## [1] "148 1043"
## [1] "136 1179"
## [1] "119 1298"
## [1] "104 1402"
## [1] "118 1520"
## [1] "115 1635"
## [1] "126 1761"
## [1] "141 1902"
## [1] "135 2037"
## [1] "125 2162"
## [1] "149 2311"
## [1] "170 2481"
## [1] "170 2651"
## [1] "158 2809"
## [1] "133 2942"
## [1] "114 3056"
## [1] "140 3196"
## [1] "145 3341"
## [1] "150 3491"
## [1] "178 3669"
## [1] "163 3832"
## [1] "172 4004"
## [1] "178 4182"
## [1] "199 4381"
## [1] "199 4580"
## [1] "184 4764"
## [1] "162 4926"
## [1] "146 5072"
## [1] "166 5238"
## [1] "171 5409"
## [1] "180 5589"
## [1] "193 5782"
## [1] "181 5963"
## [1] "183 6146"
## [1] "218 6364"
## [1] "230 6594"
## [1] "242 6836"
## [1] "209 7045"
## [1] "191 7236"
## [1] "172 7408"
## [1] "194 7602"
## [1] "196 7798"
## [1] "196 7994"
## [1] "236 8230"
## [1] "235 8465"
## [1] "229 8694"
## [1] "243 8937"
## [1] "264 9201"
## [1] "272 9473"
## [1] "237 9710"
## [1] "211 9921"
## [1] "180 10101"
## [1] "201 10302"
## [1] "204 10506"
## [1] "188 10694"
## [1] "235 10929"
## [1] "227 11156"
## [1] "234 11390"
## [1] "264 11654"
## [1] "302 11956"
## [1] "293 12249"
## [1] "259 12508"
## [1] "229 12737"
## [1] "203 12940"
## [1] "229 13169"
## [1] "242 13411"
## [1] "233 13644"
## [1] "267 13911"
## [1] "269 14180"
## [1] "270 14450"
## [1] "315 14765"
## [1] "364 15129"
## [1] "347 15476"
## [1] "312 15788"
## [1] "274 16062"
## [1] "237 16299"
## [1] "278 16577"
## [1] "284 16861"
## [1] "277 17138"
## [1] "317 17455"
## [1] "313 17768"
## [1] "318 18086"
## [1] "374 18460"
## [1] "413 18873"
## [1] "405 19278"
## [1] "355 19633"
## [1] "306 19939"
## [1] "271 20210"
## [1] "306 20516"
## [1] "315 20831"
## [1] "301 21132"
## [1] "356 21488"
## [1] "348 21836"
## [1] "355 22191"
## [1] "422 22613"
## [1] "465 23078"
## [1] "467 23545"
## [1] "404 23949"
## [1] "347 24296"
## [1] "305 24601"
## [1] "336 24937"
## [1] "340 25277"
## [1] "318 25595"
## [1] "362 25957"
## [1] "348 26305"
## [1] "363 26668"
## [1] "435 27103"
## [1] "491 27594"
## [1] "505 28099"
## [1] "404 28503"
## [1] "359 28862"
## [1] "310 29172"
## [1] "337 29509"
## [1] "360 29869"
## [1] "342 30211"
## [1] "406 30617"
## [1] "396 31013"
## [1] "420 31433"
## [1] "472 31905"
## [1] "548 32453"
## [1] "559 33012"
## [1] "463 33475"
## [1] "407 33882"
## [1] "362 34244"
## [1] "405 34649"
## [1] "417 35066"
## [1] "391 35457"
## [1] "419 35876"
## [1] "461 36337"
## [1] "472 36809"
## [1] "535 37344"
## [1] "622 37966"
## [1] "606 38572"
## [1] "508 39080"
## [1] "461 39541"
## [1] "390 39931"
## [1] "432 40363"
View(Result1)


#Opcao 2

Count2<-AirPassengers[1]
for (i in 2:144){
  Count2[i]<- Count2[i-1] + AirPassengers[i]
}
View(Count2)

As funções tem uma sintaxe simples de implementação, pois basta atribuir da seguinte forma:

Nome_da_funcao <- function(argument1, argument2, argumentn){ código da função return (aqui você coloca o que quer como saída da função) }

Veja alguns exemplos e agora sim usaremos IF :-).

# Teste de função 1 (usando pronta)
FuncFatorial<-function(N){
  
  OutFactorial<-factorial(x = N)
  
return(OutFactorial)
}


Test<-FuncFatorial(3)
Test
## [1] 6
# Teste de função 2 (Fatorial caseiro)
FuncFatorial1<-function(N){
  if (N<0) {
    stop("Não permitido número negativo")
  } else {
    aux<-1
    while (N >= 1){
      aux<-aux*N
      N<-N-1
    }
  }
  return(aux)
}

FuncFatorial1(5)
## [1] 120
#Função de inversão opção 1
FuncInvert1<-function(N){
  N[length(N):1]
    }

FuncInvert1(2:15)
##  [1] 15 14 13 12 11 10  9  8  7  6  5  4  3  2
#Função de inversão opção 2
FuncInvert2<-function(N){
    r<-c()
    for (j in seq_along(N)){
      r<-c(N[j],r)
    }
    return(r)
  }

FuncInvert2(2:15)
##  [1] 15 14 13 12 11 10  9  8  7  6  5  4  3  2
  LoopAcc<-function(Vector1){
    Count1<-0 #quando for somatória de inteiro, não usar c()
    Result1<-c()
    for (i in Vector1){
      Count1<-Count1 + i
      Result1<- c(Result1, Count1)
    }
    return(Result1)
  }

  debugonce(LoopAcc)
  #Testes da função, com opção de debug.
  LoopAcc(2:4)
## debugging in: LoopAcc(2:4)
## debug em <text>#50: {
##     Count1 <- 0
##     Result1 <- c()
##     for (i in Vector1) {
##         Count1 <- Count1 + i
##         Result1 <- c(Result1, Count1)
##     }
##     return(Result1)
## }
## debug em <text>#51: Count1 <- 0
## debug em <text>#52: Result1 <- c()
## debug em <text>#53: for (i in Vector1) {
##     Count1 <- Count1 + i
##     Result1 <- c(Result1, Count1)
## }
## debug em <text>#54: Count1 <- Count1 + i
## debug em <text>#55: Result1 <- c(Result1, Count1)
## debug em <text>#54: Count1 <- Count1 + i
## debug em <text>#55: Result1 <- c(Result1, Count1)
## debug em <text>#54: Count1 <- Count1 + i
## debug em <text>#55: Result1 <- c(Result1, Count1)
## debug em <text>#57: return(Result1)
## exiting from: LoopAcc(2:4)
## [1] 2 5 9

Abaixo mostramos mais algumas funções para environment e que podem ser úteis em algum momento, em especial se você usa o R em um ambiente de produção.

#Exemplos de funções de environment
  e1 = new.env()
  assign("var1", 1, envir = e1 )
  get("var1", envir = e1)
## [1] 1
  exists("var1", envir = e1)
## [1] TRUE
  rm("var1", envir = e1)
  exists("var1", envir = e1)
## [1] FALSE
  rm(e1)
  
  globalenv()
## <environment: R_GlobalEnv>
  .GlobalEnv
## <environment: R_GlobalEnv>
  environment()  
## <environment: R_GlobalEnv>

Agora podemos usar funções para outras finalidades, como manipulação de arquivos, conforme algumas linhas de código abaixo.

#diretórios
  
#aqui verificamos qual é o diretório de trabalho que o R usa. Assim quando usamos arquivos, seja para salvar ou abrir, usamos este diretório como "Default".
  setwd("C:/Users/BRJUVEN1/iCloudDrive/Documents/GitHub/R_Language")
  getwd()
## [1] "C:/Users/BRJUVEN1/iCloudDrive/Documents/GitHub/R_Language"
#Podemos mudar o diretório de trabalho, com a função abaixo:

#setwd("C:/Users/logonrmlocal/data")

#Deixei comentado com #, só pra não mudar nada neste momento. Mas fica a dica.


#Aqui criamos a pasta JVdata no diretório de trabalho, caso não exista.

  if(!file.exists('JVdata')){
    dir.create('JVdata')
  }

  
  file.url = 'https://storage.googleapis.com/ds-publico/IE1-04.xlsx'
  file.local = file.path('./JVdata', basename(file.url))
  download.file(url = file.url, destfile = file.local , mode='wb')
    
  
  #Usando Função para baixar arquivo
  
  DownloadFromWeb<-function(URLAux){
    if(!file.exists('JVdata')){
      dir.create('JVdata')
    }
    file.local <- file.path('./JVdata', basename(URLAux))
    download.file(url = URLAux, destfile = file.local , mode='wb')
  }
  
  DownloadFromWeb('https://storage.googleapis.com/ds-publico/Copas.csv')
  
  DownloadFromWeb('https://storage.googleapis.com/ds-publico/Copas-Partidas.csv')
  
  DownloadFromWeb('https://storage.googleapis.com/ds-publico/Copas-Jogadores.csv')
  
  #Funções para ler tabela
  
  library(readr)
  read.table(file = 'JVData/Copas.csv', sep=',',header = TRUE)
##    Year      Country     Winner     Runners.Up       Third         Fourth
## 1  1930      Uruguay    Uruguay      Argentina         USA     Yugoslavia
## 2  1934        Italy      Italy Czechoslovakia     Germany        Austria
## 3  1938       France      Italy        Hungary      Brazil         Sweden
## 4  1950       Brazil    Uruguay         Brazil      Sweden          Spain
## 5  1954  Switzerland Germany FR        Hungary     Austria        Uruguay
## 6  1958       Sweden     Brazil         Sweden      France     Germany FR
## 7  1962        Chile     Brazil Czechoslovakia       Chile     Yugoslavia
## 8  1966      England    England     Germany FR    Portugal   Soviet Union
## 9  1970       Mexico     Brazil          Italy  Germany FR        Uruguay
## 10 1974      Germany Germany FR    Netherlands      Poland         Brazil
## 11 1978    Argentina  Argentina    Netherlands      Brazil          Italy
## 12 1982        Spain      Italy     Germany FR      Poland         France
## 13 1986       Mexico  Argentina     Germany FR      France        Belgium
## 14 1990        Italy Germany FR      Argentina       Italy        England
## 15 1994          USA     Brazil          Italy      Sweden       Bulgaria
## 16 1998       France     France         Brazil     Croatia    Netherlands
## 17 2002  Korea/Japan     Brazil        Germany      Turkey Korea Republic
## 18 2006      Germany      Italy         France     Germany       Portugal
## 19 2010 South Africa      Spain    Netherlands     Germany        Uruguay
## 20 2014       Brazil    Germany      Argentina Netherlands         Brazil
##    GoalsScored QualifiedTeams MatchesPlayed Attendance
## 1           70             13            18    590.549
## 2           70             16            17    363.000
## 3           84             15            18    375.700
## 4           88             13            22  1.045.246
## 5          140             16            26    768.607
## 6          126             16            35    819.810
## 7           89             16            32    893.172
## 8           89             16            32  1.563.135
## 9           95             16            32  1.603.975
## 10          97             16            38  1.865.753
## 11         102             16            38  1.545.791
## 12         146             24            52  2.109.723
## 13         132             24            52  2.394.031
## 14         115             24            52  2.516.215
## 15         141             24            52  3.587.538
## 16         171             32            64  2.785.100
## 17         161             32            64  2.705.197
## 18         147             32            64  3.359.439
## 19         145             32            64  3.178.856
## 20         171             32            64  3.386.810
  #Funções para ler tabela. Código gerado pelo Import DataSet... (Opção em Files, selecionando direto o arquivo)
  library(readr)
  Copas_Jogadores <- read_csv("JVdata/Copas-Jogadores.csv")
## Parsed with column specification:
## cols(
##   RoundID = col_double(),
##   MatchID = col_double(),
##   `Team Initials` = col_character(),
##   `Coach Name` = col_character(),
##   `Line-up` = col_character(),
##   `Shirt Number` = col_double(),
##   `Player Name` = col_character(),
##   Position = col_character(),
##   Event = col_character()
## )
  View(Copas_Jogadores)

  Copas_Partidas <- read_csv("JVdata/Copas-Partidas.csv")
## Parsed with column specification:
## cols(
##   .default = col_character(),
##   Year = col_double(),
##   `Home Team Goals` = col_double(),
##   `Away Team Goals` = col_double(),
##   Attendance = col_double(),
##   `Half-time Home Goals` = col_double(),
##   `Half-time Away Goals` = col_double(),
##   RoundID = col_double(),
##   MatchID = col_double()
## )
## See spec(...) for full column specifications.
  View(Copas_Partidas)
  
  
  #Funções específicas para Excel
  library(readxl)
  #read_excel()  
  
  DownloadFromWeb('https://storage.googleapis.com/ds-publico/cameras.baltimore.xlsx')
  
  library(readxl)
  getwd()
## [1] "C:/Users/BRJUVEN1/iCloudDrive/Documents/GitHub/R_Language"
  cameras_baltimore <- read_excel("JVdata/cameras.baltimore.xlsx")
  View(cameras_baltimore)
  
  #Aqui usamos algumas funções para manipular informações dos arquivos. Como máximo e mínimo.
  View(Norte<-cameras_baltimore[which.max(cameras_baltimore$Lat),])
  View(Sul<-cameras_baltimore[which.min(cameras_baltimore$Lat),])
  View(Leste<-cameras_baltimore[which.max(cameras_baltimore$Long),])
  View(Oeste<-cameras_baltimore[which.min(cameras_baltimore$Long),])
  
  #Lendo um arquivo de imagem do tipo jpg.
  read_file('JVdata/RLogo.jpg')
## [1] "<ff><d8><ff><e0>"

Um operador muito comum de uso no R é o PIPE, que facilita a visualização do código. Veja alguns exemplos.

#Pipe - Usado para mover resultados de funções para outras em cadeia
#melhora a visualização do código em relação a outras linguagens

head(starwars)
## # A tibble: 6 x 14
##   name  height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 Luke…    172    77 blond      fair       blue            19   male  mascu…
## 2 C-3PO    167    75 <NA>       gold       yellow         112   none  mascu…
## 3 R2-D2     96    32 <NA>       white, bl… red             33   none  mascu…
## 4 Dart…    202   136 none       white      yellow          41.9 male  mascu…
## 5 Leia…    150    49 brown      light      brown           19   fema… femin…
## 6 Owen…    178   120 brown, gr… light      blue            52   male  mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
starwars %>% head(.)
## # A tibble: 6 x 14
##   name  height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 Luke…    172    77 blond      fair       blue            19   male  mascu…
## 2 C-3PO    167    75 <NA>       gold       yellow         112   none  mascu…
## 3 R2-D2     96    32 <NA>       white, bl… red             33   none  mascu…
## 4 Dart…    202   136 none       white      yellow          41.9 male  mascu…
## 5 Leia…    150    49 brown      light      brown           19   fema… femin…
## 6 Owen…    178   120 brown, gr… light      blue            52   male  mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
10 %>% head(starwars, .)
## # A tibble: 10 x 14
##    name  height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke…    172    77 blond      fair       blue            19   male  mascu…
##  2 C-3PO    167    75 <NA>       gold       yellow         112   none  mascu…
##  3 R2-D2     96    32 <NA>       white, bl… red             33   none  mascu…
##  4 Dart…    202   136 none       white      yellow          41.9 male  mascu…
##  5 Leia…    150    49 brown      light      brown           19   fema… femin…
##  6 Owen…    178   120 brown, gr… light      blue            52   male  mascu…
##  7 Beru…    165    75 brown      light      blue            47   fema… femin…
##  8 R5-D4     97    32 <NA>       white, red red             NA   none  mascu…
##  9 Bigg…    183    84 black      light      brown           24   male  mascu…
## 10 Obi-…    182    77 auburn, w… fair       blue-gray       57   male  mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
starwars %>% head(., 10)
## # A tibble: 10 x 14
##    name  height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke…    172    77 blond      fair       blue            19   male  mascu…
##  2 C-3PO    167    75 <NA>       gold       yellow         112   none  mascu…
##  3 R2-D2     96    32 <NA>       white, bl… red             33   none  mascu…
##  4 Dart…    202   136 none       white      yellow          41.9 male  mascu…
##  5 Leia…    150    49 brown      light      brown           19   fema… femin…
##  6 Owen…    178   120 brown, gr… light      blue            52   male  mascu…
##  7 Beru…    165    75 brown      light      blue            47   fema… femin…
##  8 R5-D4     97    32 <NA>       white, red red             NA   none  mascu…
##  9 Bigg…    183    84 black      light      brown           24   male  mascu…
## 10 Obi-…    182    77 auburn, w… fair       blue-gray       57   male  mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
starwars %>% head(10)
## # A tibble: 10 x 14
##    name  height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Luke…    172    77 blond      fair       blue            19   male  mascu…
##  2 C-3PO    167    75 <NA>       gold       yellow         112   none  mascu…
##  3 R2-D2     96    32 <NA>       white, bl… red             33   none  mascu…
##  4 Dart…    202   136 none       white      yellow          41.9 male  mascu…
##  5 Leia…    150    49 brown      light      brown           19   fema… femin…
##  6 Owen…    178   120 brown, gr… light      blue            52   male  mascu…
##  7 Beru…    165    75 brown      light      blue            47   fema… femin…
##  8 R5-D4     97    32 <NA>       white, red red             NA   none  mascu…
##  9 Bigg…    183    84 black      light      brown           24   male  mascu…
## 10 Obi-…    182    77 auburn, w… fair       blue-gray       57   male  mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
#outro exemplo de pipe
starwars %>%
  filter(species == "Droid")
## # A tibble: 6 x 14
##   name  height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 C-3PO    167    75 <NA>       gold       yellow           112 none  mascu…
## 2 R2-D2     96    32 <NA>       white, bl… red               33 none  mascu…
## 3 R5-D4     97    32 <NA>       white, red red               NA none  mascu…
## 4 IG-88    200   140 none       metal      red               15 none  mascu…
## 5 R4-P…     96    NA none       silver, r… red, blue         NA none  femin…
## 6 BB8       NA    NA none       none       black             NA none  mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
#exemplo já direcionando o resultado para a função View()
starwars %>%
  filter(species == "Droid") %>%
  View()


#Pipe para fazer Agregação
  
  starwars %>%
    group_by(species) %>%
    summarise(
      j = n(),
      mass = mean(mass, na.rm = TRUE)
    ) %>%
    filter(j > 1)
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 9 x 3
##   species      j  mass
##   <chr>    <int> <dbl>
## 1 Droid        6  69.8
## 2 Gungan       3  74  
## 3 Human       35  82.8
## 4 Kaminoan     2  88  
## 5 Mirialan     2  53.1
## 6 Twi'lek      2  55  
## 7 Wookiee      2 124  
## 8 Zabrak       2  80  
## 9 <NA>         4  48

Já vimos alguns gráficos anteriormente, mas agora vamos dedicar um tempo maior para eles. Veja abaixo alguns códigos de exemplos para manipulação de dados e geração de gráficos.

# Fazendo gráficos

#Ajustando o TimeZone para trabalhar com horário

x = -10:10
plot(x=x,y=x**2,main='Parábola')

plot(x=x,y=x**2,main='Parábola', type = 'l')

plot(x=x,y=x**2,main='Parábola', type = 'p')

plot(x=x,y=x**2,main='Parábola', type = 'b')

plot(x=x,y=x**2,main='Parábola', type = 'o')

plot(x=x,y=x**2,main='Parábola', type = 'h')

plot(x=x,y=x**2,main='Parábola', type = 's')

head(cars)
##   speed dist
## 1     4    2
## 2     4   10
## 3     7    4
## 4     7   22
## 5     8   16
## 6     9   10
summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00
plot(x=cars$speed, y = cars$dist)
plot(cars$speed, cars$dist)

plot(cars)


airquality %>% 
  #  filter(Month == 5) %>%
  select(Wind, Ozone) %>%
  lm(Ozone ~ Wind, data=.)->regressao
regressao
## 
## Call:
## lm(formula = Ozone ~ Wind, data = .)
## 
## Coefficients:
## (Intercept)         Wind  
##      96.873       -5.551
abline(regressao, col="red")


#fazendo linha de regressão na mão, sem o abline

xi = 0
yi = regressao$coefficients["(Intercept)"] + regressao$coefficients[2]*xi


xf = 18
yf = regressao$coefficients["(Intercept)"] + regressao$coefficients[2]*xf

lines(x = c(xi, xf), y=c(yi, yf), col="blue")

predict(regressao, newdata = data.frame(Wind=c(0,13,18)))
##         1         2         3 
## 96.872895 24.710897 -3.043717
predict(regressao, newdata = data.frame(Wind=c(0:10)))
##        1        2        3        4        5        6        7        8 
## 96.87289 91.32197 85.77105 80.22013 74.66920 69.11828 63.56736 58.01643 
##        9       10       11 
## 52.46551 46.91459 41.36367
# Usando o plot_ly
#Monta o gráfico e armazena em p
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
plot_ly(data = airquality,
        x = ~Wind, y = ~Ozone,
        text = ~paste0(Day, '/', Month),
        type = 'scatter', mode ='markers') -> p
#Exibe p
print( p )
## Warning: Ignoring 37 observations
## Warning: `arrange_()` is deprecated as of dplyr 0.7.0.
## Please use `arrange()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
#?plotly

add_segments(p, x=xi, xend = xf, y=yi, yend = yf, color=I("blue"))
## Warning: Ignoring 37 observations
## Warning: `group_by_()` is deprecated as of dplyr 0.7.0.
## Please use `group_by()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.

Este portfólio não tem o objetivo de torná-lo um especialista, mas espero que tenha conseguido aprender algo até o momento.

Para facilitar o uso do R, recomendo fortemente a fazer os exercícios interativos de R, usando o próprio R Studio, são 13 temas que vão reforçar os tópicos que mencionei neste documento. Abaixo vou colocar as linhas de códigos para realizar o exercício. Caso você não tenha rodado todo o R Markdown, então coloquei algumas linhas adicionais, que já foram usadas em tópicos anteriores, mas creio que funcionará no seu computador.

No final você pode direcionar sua conclusão para uma página WEB, caso seja aluno da FIAP, turma 11IA. Esta é uma funcionalidade sensacional que o mestre ELTHON implementou.

Tive a felicidade de poder fazer os 13 tópicos de exercícios e com certeza eles me ajudaram bastante a desenvolver este documento.

#Set TimeZone
Test1<-0
as.POSIXlt.POSIXct(Test1, tz = "America/Sao_Paulo")
## [1] "1969-12-31 21:00:00 -03"
# Instala pacote swirl
#install.packages("swirl")
#library(swirl)


# Instala curso
#library(swirl)
#uninstall_course('Aprenda_R_no_R')
#install_course_github('elthonf','Aprenda_R_no_R')

# Inicia os cursos interativos
#swirl()
# Inicia os cursos interativos para novas sessões
#library(swirl)
#select_language(language = 'portuguese')
#swirl()


# Outros comandos
#library(swirl)
#bye()
#info()
Sys.setlocale("LC_ALL", 'en_US.UTF-8')
## Warning in Sys.setlocale("LC_ALL", "en_US.UTF-8"): SO informa que a requisição
## para definir o locale como 'en_US.UTF-8' não pode ser honrada
## [1] ""
  1. TRABALHO DE ANÁLISE EXPLORATÓRIA Como parte da conclusão do curso de R, fiz um estudo com a parceria de 3 colegas da classe, sobre a análise exploratória de dados e coloco aqui o link para download da apresentação. Agredeço ao Fabio, Thiago e José Raimundo por compartilharem seus conhecimentos neste trabalho e deixo o crédito a eles.

https://drive.google.com/drive/folders/1frXTDapAi-yfWjGdxzdvB3iB8ZkUSm4P?usp=sharing

  1. OUTRAS INFORMAÇÕES Como curiosidade e para testar meus conhecimentos fiz um avaliação no Linkedin para R. É bem interessante, pois são diversar perguntas com alternativas e muito bom para se auto-avaliar. Infelizmente não passei quando eu fiz, pois ainda nem tinha começado este portfólio e as aulas ainda estavam na metade. Poderei fazer um novo teste daqui a 3 meses (meados de março de 2020), assim tentarei atualizar esta informação aqui, caso eu tenha atingido os 70% exigidos pelo Linkedin :-). Caso você tenha lido todo o portfólio, creio que poderá fazer o teste.

  2. SITES IMPORTANTES

CRAN – Manuais oficiais http://cran.r-project.org

Uma introdução ao R http://cran.r-project.org/doc/manuals/r-release/R-intro.html

R Data Import/Export http://cran.r-project.org/doc/manuals/r-release/R-data.html

Writing R Extensions: Como escrever e organizar pacotes R http://cran.r-project.org/doc/manuals/r-release/R-exts.html

R Installation and Administration: Como compilar o R a partir do Código fonte http://cran.r-project.org/doc/manuals/r-release/R-admin.html

R Internals: Manuais da estrutura de baixo nível para desenvolvedores R e membros do “R Core” http://cran.r-project.org/doc/manuals/r-release/R-ints.html

Definição da linguagem R: Documentos para desenvolvedores http://cran.r-project.org/doc/manuals/r-release/R-lang.html

  1. LITERATURA RECOMENDADA

Título: Como Mentir com Estatística Autor: Darrell Huff

  1. BIBLIOGRAFIA